銃から発射される弾丸のエフェクトをVFXで作成している中で
- マズルフラッシュ
- 弾丸
の2エフェクトを一つのVFX内で再現できないかを考え、そのままマズルフラッシュと弾丸を紐づけてみました
左がマズルフラッシュのエフェクト、右側が弾丸エフェクト。 マズルフラッシュが再生された時に弾丸エフェクトも再生される形です
ここで弾丸はInitialize Particleノードの Set Velocity
ブロックにより、Z方向に向けて速度が加算されて前方へ進んでいきます
これを以下モデルの銃の先につけてみます
再生すると、マズル先から銃が発射されたようになります
ただ、問題なのがMuzzleの子Objectの場合、親が移動、回転されるとVFXEffectも影響を受けてしまいます
今回の銃エフェクトは発射されたら親の影響を受けたくないです
そもそもエフェクトの親をMuzzleと切り離すのも手ですが、もう一つ簡単な方法として VFX 内の座標系を親の影響を受けないようにWorldに変化させます。
座標系切り替え
各ノードの右上に Local と書かれている文字をクリックして World に変化させます
ここでエフェクトに与える座標系を変更させます。
この状態で再生すると以下
親の影響を受けなくなりましたが、その代わりマズルエフェクトと弾丸エフェクトの位置がずれています。
親の影響を受けなくなった = 再生時の座標、回転 も影響受けない ため。
これでは実装上めんどくさいため、各 Initialize Particle ノード に **SetPosition **を追加します。 ここで 座標系は Local にしておきます。
この場合、パーティクル生成時はLocal座標系の (0, 0, 0) で配置されますが、その後はWorld空間で処理されます
これで実装した結果が以下
マズル(親) の位置にエフェクトが再生されます
そして親の座標系によらないため銃を回転させても影響を受けなくなりました
しかしまだ問題があります。 銃を回転させた状態でエフェクトを再生させた場合、座標が必ずZ軸固定になってしまいました
回転も親の影響を受けないからです
Set Position と同じく、Set Angle にも Local, World の切り替えがあるかと思ったのですが特に見当たりませんでした
設定を見直します。
まず、VelocityはマズルのZ軸方向に向いて飛んでいくように Transform(Vector) ブロックを利用します
Transform (W) に対し、BulletSpeed を Z 方向のみに設定することで、マズルのZ方向にVelocityが働くようにしました。
そして弾丸のOutputには Orient: Along Velocity をアタッチします ※ドキュメント https://docs.unity3d.com/Packages/com.unity.visualeffectgraph@11.0/manual/Block-Orient.html
このブロックによりパーティクルがVelocityの方角を正面とするようになります。 つまり弾丸の Velocity(マズルのZ軸) に向かいパーティクルの向きが決まるため弾丸の回転も正しくなります
以上の設定でパーティクルの回転軸も問題なくなりました
参考
https://forum.unity.com/threads/world-space-issues.862549/
https://forum.unity.com/threads/how-do-i-keep-particle-local-angle.1107233/
https://docs.unity3d.com/ja/Packages/com.unity.visualeffectgraph@10.7/manual/Block-Orient.html tml)